Badanym zbiorem danych jest zestaw Czynniki, który opisuje czynniki wpływające na wyniki uczniów.
dane
## # A tibble: 6,607 × 20
## Hours_Studied Attendance Parental_Involvement Access_to_Resources
## <dbl> <dbl> <chr> <chr>
## 1 23 84 Low High
## 2 19 64 Low Medium
## 3 24 98 Medium Medium
## 4 29 89 Low Medium
## 5 19 92 Medium Medium
## 6 19 88 Medium Medium
## 7 29 84 Medium Low
## 8 25 78 Low High
## 9 17 94 Medium High
## 10 23 98 Medium Medium
## # ℹ 6,597 more rows
## # ℹ 16 more variables: Extracurricular_Activities <chr>, Sleep_Hours <dbl>,
## # Previous_Scores <dbl>, Motivation_Level <chr>, Internet_Access <chr>,
## # Tutoring_Sessions <dbl>, Family_Income <chr>, Teacher_Quality <chr>,
## # School_Type <chr>, Peer_Influence <chr>, Physical_Activity <dbl>,
## # Learning_Disabilities <chr>, Parental_Education_Level <chr>,
## # Distance_from_Home <chr>, Gender <chr>, Exam_Score <dbl>
str(dane)
## spc_tbl_ [6,607 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Hours_Studied : num [1:6607] 23 19 24 29 19 19 29 25 17 23 ...
## $ Attendance : num [1:6607] 84 64 98 89 92 88 84 78 94 98 ...
## $ Parental_Involvement : chr [1:6607] "Low" "Low" "Medium" "Low" ...
## $ Access_to_Resources : chr [1:6607] "High" "Medium" "Medium" "Medium" ...
## $ Extracurricular_Activities: chr [1:6607] "No" "No" "Yes" "Yes" ...
## $ Sleep_Hours : num [1:6607] 7 8 7 8 6 8 NA 6 6 8 ...
## $ Previous_Scores : num [1:6607] 73 59 91 98 65 89 68 50 80 71 ...
## $ Motivation_Level : chr [1:6607] "Low" "Low" "Medium" "Medium" ...
## $ Internet_Access : chr [1:6607] "Yes" "Yes" "Yes" "Yes" ...
## $ Tutoring_Sessions : num [1:6607] 0 2 2 1 3 3 1 1 0 0 ...
## $ Family_Income : chr [1:6607] "Low" "Medium" "Medium" "Medium" ...
## $ Teacher_Quality : chr [1:6607] "Medium" "Medium" "Medium" "Medium" ...
## $ School_Type : chr [1:6607] "Public" "Public" "Public" "Public" ...
## $ Peer_Influence : chr [1:6607] "Positive" "Negative" "Neutral" "Negative" ...
## $ Physical_Activity : num [1:6607] 3 4 4 4 4 3 2 2 1 5 ...
## $ Learning_Disabilities : chr [1:6607] "No" "No" "No" "No" ...
## $ Parental_Education_Level : chr [1:6607] "High School" "College" "Postgraduate" "High School" ...
## $ Distance_from_Home : chr [1:6607] "Near" "Moderate" "Near" "Moderate" ...
## $ Gender : chr [1:6607] "Male" "Female" "Male" "Male" ...
## $ Exam_Score : num [1:6607] 67 61 74 71 NA 71 67 66 69 72 ...
## - attr(*, "spec")=
## .. cols(
## .. Hours_Studied = col_double(),
## .. Attendance = col_double(),
## .. Parental_Involvement = col_character(),
## .. Access_to_Resources = col_character(),
## .. Extracurricular_Activities = col_character(),
## .. Sleep_Hours = col_double(),
## .. Previous_Scores = col_double(),
## .. Motivation_Level = col_character(),
## .. Internet_Access = col_character(),
## .. Tutoring_Sessions = col_double(),
## .. Family_Income = col_character(),
## .. Teacher_Quality = col_character(),
## .. School_Type = col_character(),
## .. Peer_Influence = col_character(),
## .. Physical_Activity = col_double(),
## .. Learning_Disabilities = col_character(),
## .. Parental_Education_Level = col_character(),
## .. Distance_from_Home = col_character(),
## .. Gender = col_character(),
## .. Exam_Score = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Zestaw ten posiada 20 zmiennych oraz 6607 obserwacji.
Dane ogólnie rzecz biorąc nie wymagają dużo oczyszczania, nazwy zmiennych nie zawierają spacji ani polskich znaków, a obserwacje są zapisane w poprawny sposób. Zmienne jakościowe można jednak zmienić na typ factor, w celu ułatwienia analizy.
Poniższy kod został wykorzystany, aby zmienić typ zmiennych jakościowych z typu character na typ factor.
dane$Parental_Involvement <- ifelse(dane$Parental_Involvement == "Low", 1,
ifelse(dane$Parental_Involvement == "Medium", 2, 3))
dane$Parental_Involvement <- factor(dane$Parental_Involvement, levels = c(1, 2, 3),
labels = c("Low", "Medium", "High"), ordered = TRUE)
dane$Access_to_Resources <- ifelse(dane$Access_to_Resources == "Low", 1,
ifelse(dane$Access_to_Resources == "Medium", 2, 3))
dane$Access_to_Resources <- factor(dane$Access_to_Resources, levels = c(1, 2, 3),
labels = c("Low", "Medium", "High"), ordered = TRUE)
dane$Extracurricular_Activities <- ifelse(dane$Extracurricular_Activities == "No", 0, 1)
dane$Extracurricular_Activities <- factor(dane$Extracurricular_Activities, levels = c(0, 1),
labels = c("No", "Yes"))
dane$Motivation_Level <- ifelse(dane$Motivation_Level == "Low", 1,
ifelse(dane$Motivation_Level == "Medium", 2, 3))
dane$Motivation_Level <- factor(dane$Motivation_Level, levels = c(1, 2, 3),
labels = c("Low", "Medium", "High"), ordered = TRUE)
dane$Internet_Access <- ifelse(dane$Internet_Access == "No", 0, 1)
dane$Internet_Access <- factor(dane$Internet_Access, levels = c(0, 1), labels = c("No", "Yes"))
dane$Family_Income <- ifelse(is.na(dane$Family_Income), NA,
ifelse(dane$Family_Income == "Low", 1,
ifelse(dane$Family_Income == "Medium", 2, 3)))
dane$Family_Income <- factor(dane$Family_Income, levels = c(1, 2, 3),
labels = c("Low", "Medium", "High"), ordered = TRUE)
dane$Teacher_Quality <- ifelse(is.na(dane$Teacher_Quality), NA,
ifelse(dane$Teacher_Quality == "Low", 1,
ifelse(dane$Teacher_Quality == "Medium", 2, 3)))
dane$Teacher_Quality <- factor(dane$Teacher_Quality, levels = c(1, 2, 3),
labels = c("Low", "Medium", "High"), ordered = TRUE)
dane$School_Type <- ifelse(dane$School_Type == "Public", 1, 2)
dane$School_Type <- factor(dane$School_Type, levels = c(1, 2), labels = c("Public", "Private"))
dane$Peer_Influence <- ifelse(dane$Peer_Influence == "Negative", 1,
ifelse(dane$Peer_Influence == "Neutral", 2, 3))
dane$Peer_Influence <- factor(dane$Peer_Influence, levels = c(1, 2, 3),
labels = c("Negative", "Neutral", "Positive"), ordered = TRUE)
dane$Learning_Disabilities <- ifelse(dane$Learning_Disabilities == "No", 0, 1)
dane$Learning_Disabilities <- factor(dane$Learning_Disabilities, levels = c(0, 1),
labels = c("No", "Yes"))
dane$Parental_Education_Level <- ifelse(is.na(dane$Parental_Education_Level), NA,
ifelse(dane$Parental_Education_Level == "High School", 1,
ifelse(dane$Parental_Education_Level == "College", 2, 3)))
dane$Parental_Education_Level <- factor(dane$Parental_Education_Level, levels = c(1, 2, 3),
labels = c("High School", "College", "Postgraduate"),
ordered = TRUE)
dane$Distance_from_Home <- ifelse(is.na(dane$Distance_from_Home), NA,
ifelse(dane$Distance_from_Home == "Far", 1,
ifelse(dane$Distance_from_Home == "Moderate", 2, 3)))
dane$Distance_from_Home <- factor(dane$Distance_from_Home, levels = c(1, 2, 3),
labels = c("Far", "Moderate", "Near"), ordered = TRUE)
dane$Gender <- ifelse(dane$Gender == "Female", 1, 2)
dane$Gender <- factor(dane$Gender, levels = c(1, 2), labels = c("Female", "Male"))
Stworzone zostały reguły walidacyjne dla każdej zmiennej. Dla zmiennych ilościowych wprowadzono regułę wymagającego, aby zmienna była liczbą oraz określono przedziały, w których mogą się znajdować wynikające z charakteru zmiennej, np. liczba godzin snu musi być większa lub równa 0, ale nie większa niż 24 ze względu liczbę godzin w ciągu dnia. Dla zmiennych jakościowych wprowadzono ograniczenia wymagające od nich bycia zmienną factor oraz sprawdzające czy obserwacje opisane są jedną z możliwych odpowiedzi dla dane zmiennej.
# Stworzenie reguł walidacyjnych
rules <- check_that(dane,
# Reguły dla zmiennej Hours_Studied
is.numeric(Hours_Studied), #1
Hours_Studied >= 0, #2
Hours_Studied <= 168, #3
# Reguły dla zmiennej Attendance
is.numeric(Attendance), #4
Attendance >= 0, #5
Attendance <= 100, #6
# Reguły dla zmiennej Parental_Involvement
is.factor(Parental_Involvement), #7
Parental_Involvement %in% c("Low", "Medium", "High"), #8
# Reguły dla zmiennej Access_to_Resources
is.factor(Access_to_Resources), #9
Access_to_Resources %in% c("Low", "Medium", "High"), #10
# Reguły dla zmiennej Extracurricular_Activities
is.factor(Extracurricular_Activities), #11
Extracurricular_Activities %in% c("No", "Yes"), #12
# Reguły dla zmiennej Sleep_Hours
is.numeric(Sleep_Hours), #13
Sleep_Hours >= 0, #14
Sleep_Hours <= 24, #15
# Reguły dla zmiennej Previous_Scores
is.numeric(Previous_Scores), #16
Previous_Scores >= 0, #17
Previous_Scores <= 100, #18
# Reguły dla zmiennej Motivation_Level
is.factor(Motivation_Level), #19
Motivation_Level %in% c("Low", "Medium", "High"), #20
# Reguły dla zmiennej Internet_Access
is.factor(Internet_Access), #21
Internet_Access %in% c("No", "Yes"), #22
# Reguły dla zmiennej Tutoring_Sessions
is.numeric(Tutoring_Sessions), #23
Tutoring_Sessions >= 0, #24
(Tutoring_Sessions - floor(Tutoring_Sessions)) == 0, #25
# Reguły dla zmiennej Family_Income
is.factor(Family_Income), #26
Family_Income %in% c("Low", "Medium", "High"), #27
# Reguły dla zmiennej Teacher_Quality
is.factor(Teacher_Quality), #28
Teacher_Quality %in% c("Low", "Medium", "High"), #29
# Reguły dla zmiennej School_Type
is.factor(School_Type), #30
School_Type %in% c("Public", "Private"), #31
# Reguły dla zmiennej Peer_Influence
is.factor(Peer_Influence), #32
Peer_Influence %in% c("Negative", "Neutral", "Positive"), #33
# Reguły dla zmiennej Physical_Activity
is.numeric(Physical_Activity), #34
Physical_Activity >= 0, #35
Physical_Activity <= 168, #36
# Reguły dla zmiennej Learning_Disabilities
is.factor(Learning_Disabilities), #37
Learning_Disabilities %in% c("No", "Yes"), #38
# Reguły dla zmiennej Parental_Education_Level
is.factor(Parental_Education_Level), #39
Parental_Education_Level %in% c("High School", "College", "Postgraduate"), #40
# Reguły dla zmiennej Distance_from_Home
is.factor(Distance_from_Home), #41
Distance_from_Home %in% c("Far", "Moderate", "Near"), #42
# Reguły dla zmiennej Gender
is.factor(Gender), #43
Gender %in% c("Female", "Male"), #44
# Reguły dla zmiennej Exam_Score
is.numeric(Exam_Score), #45
Exam_Score >= 0, #46
Exam_Score <= 100 #47
)
summary(rules)
## name items passes fails nNA error warning
## 1 V01 1 1 0 0 FALSE FALSE
## 2 V02 6607 6607 0 0 FALSE FALSE
## 3 V03 6607 6607 0 0 FALSE FALSE
## 4 V04 1 1 0 0 FALSE FALSE
## 5 V05 6607 6607 0 0 FALSE FALSE
## 6 V06 6607 6607 0 0 FALSE FALSE
## 7 V07 1 1 0 0 FALSE FALSE
## 8 V08 6607 6607 0 0 FALSE FALSE
## 9 V09 1 1 0 0 FALSE FALSE
## 10 V10 6607 6607 0 0 FALSE FALSE
## 11 V11 1 1 0 0 FALSE FALSE
## 12 V12 6607 6607 0 0 FALSE FALSE
## 13 V13 1 1 0 0 FALSE FALSE
## 14 V14 6607 6257 0 350 FALSE FALSE
## 15 V15 6607 6257 0 350 FALSE FALSE
## 16 V16 1 1 0 0 FALSE FALSE
## 17 V17 6607 6607 0 0 FALSE FALSE
## 18 V18 6607 6607 0 0 FALSE FALSE
## 19 V19 1 1 0 0 FALSE FALSE
## 20 V20 6607 6607 0 0 FALSE FALSE
## 21 V21 1 1 0 0 FALSE FALSE
## 22 V22 6607 6607 0 0 FALSE FALSE
## 23 V23 1 1 0 0 FALSE FALSE
## 24 V24 6607 6607 0 0 FALSE FALSE
## 25 V25 6607 6607 0 0 FALSE FALSE
## 26 V26 1 1 0 0 FALSE FALSE
## 27 V27 6607 6257 0 350 FALSE FALSE
## 28 V28 1 1 0 0 FALSE FALSE
## 29 V29 6607 6529 0 78 FALSE FALSE
## 30 V30 1 1 0 0 FALSE FALSE
## 31 V31 6607 6607 0 0 FALSE FALSE
## 32 V32 1 1 0 0 FALSE FALSE
## 33 V33 6607 6607 0 0 FALSE FALSE
## 34 V34 1 1 0 0 FALSE FALSE
## 35 V35 6607 6607 0 0 FALSE FALSE
## 36 V36 6607 6607 0 0 FALSE FALSE
## 37 V37 1 1 0 0 FALSE FALSE
## 38 V38 6607 6607 0 0 FALSE FALSE
## 39 V39 1 1 0 0 FALSE FALSE
## 40 V40 6607 6517 0 90 FALSE FALSE
## 41 V41 1 1 0 0 FALSE FALSE
## 42 V42 6607 6540 0 67 FALSE FALSE
## 43 V43 1 1 0 0 FALSE FALSE
## 44 V44 6607 6607 0 0 FALSE FALSE
## 45 V45 1 1 0 0 FALSE FALSE
## 46 V46 6607 6307 0 300 FALSE FALSE
## 47 V47 6607 6306 1 300 FALSE FALSE
## expression
## 1 is.numeric(Hours_Studied)
## 2 Hours_Studied - 0 >= -1e-08
## 3 Hours_Studied - 168 <= 1e-08
## 4 is.numeric(Attendance)
## 5 Attendance - 0 >= -1e-08
## 6 Attendance - 100 <= 1e-08
## 7 is.factor(Parental_Involvement)
## 8 Parental_Involvement %vin% c("Low", "Medium", "High")
## 9 is.factor(Access_to_Resources)
## 10 Access_to_Resources %vin% c("Low", "Medium", "High")
## 11 is.factor(Extracurricular_Activities)
## 12 Extracurricular_Activities %vin% c("No", "Yes")
## 13 is.numeric(Sleep_Hours)
## 14 Sleep_Hours - 0 >= -1e-08
## 15 Sleep_Hours - 24 <= 1e-08
## 16 is.numeric(Previous_Scores)
## 17 Previous_Scores - 0 >= -1e-08
## 18 Previous_Scores - 100 <= 1e-08
## 19 is.factor(Motivation_Level)
## 20 Motivation_Level %vin% c("Low", "Medium", "High")
## 21 is.factor(Internet_Access)
## 22 Internet_Access %vin% c("No", "Yes")
## 23 is.numeric(Tutoring_Sessions)
## 24 Tutoring_Sessions - 0 >= -1e-08
## 25 (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0
## 26 is.factor(Family_Income)
## 27 Family_Income %vin% c("Low", "Medium", "High")
## 28 is.factor(Teacher_Quality)
## 29 Teacher_Quality %vin% c("Low", "Medium", "High")
## 30 is.factor(School_Type)
## 31 School_Type %vin% c("Public", "Private")
## 32 is.factor(Peer_Influence)
## 33 Peer_Influence %vin% c("Negative", "Neutral", "Positive")
## 34 is.numeric(Physical_Activity)
## 35 Physical_Activity - 0 >= -1e-08
## 36 Physical_Activity - 168 <= 1e-08
## 37 is.factor(Learning_Disabilities)
## 38 Learning_Disabilities %vin% c("No", "Yes")
## 39 is.factor(Parental_Education_Level)
## 40 Parental_Education_Level %vin% c("High School", "College", "Postgraduate")
## 41 is.factor(Distance_from_Home)
## 42 Distance_from_Home %vin% c("Far", "Moderate", "Near")
## 43 is.factor(Gender)
## 44 Gender %vin% c("Female", "Male")
## 45 is.numeric(Exam_Score)
## 46 Exam_Score - 0 >= -1e-08
## 47 Exam_Score - 100 <= 1e-08
Istnieje jedna obserwacja, w której jedna zmienna wykracza poza swój dozwolony przedział.
dane %>%
filter(!(Exam_Score >= 0 & Exam_Score <= 100)) %>%
select(Exam_Score)
## # A tibble: 1 × 1
## Exam_Score
## <dbl>
## 1 101
W jednej obserwacji wynik z egzaminu (zmienna Exam_Score) został wprowadzony jako 101, mimo że wynik może wynosić maksymalnie 100. To najprawdopodobniej błąd przy wprowadzaniu danych, dlatego ta wartość zostanie zmieniona na 100.
dane$Exam_Score <- ifelse(dane$Exam_Score > 100, 100, dane$Exam_Score)
Poza tym nie ma żadnych innych obserwacji, które nie spełniają którejś z reguł walidacyjnych.
na_count <- sum(!complete.cases(dane))
na_count
## [1] 1141
na_count / nrow(dane)
## [1] 0.1726956
W zestawie danych łącznie 1141 obserwacji posiada braki danych, co stanowi około 17%. Jest to bardzo dużo. Można sprawdzić, w których konkretnie kolumnach występują braki danych.
for(i in 1:ncol(dane)) {
cat("Liczba braków danych w kolumnie", names(dane[, i]), ":", sum(is.na(dane[ , i])), "\n")
}
## Liczba braków danych w kolumnie Hours_Studied : 0
## Liczba braków danych w kolumnie Attendance : 0
## Liczba braków danych w kolumnie Parental_Involvement : 0
## Liczba braków danych w kolumnie Access_to_Resources : 0
## Liczba braków danych w kolumnie Extracurricular_Activities : 0
## Liczba braków danych w kolumnie Sleep_Hours : 350
## Liczba braków danych w kolumnie Previous_Scores : 0
## Liczba braków danych w kolumnie Motivation_Level : 0
## Liczba braków danych w kolumnie Internet_Access : 0
## Liczba braków danych w kolumnie Tutoring_Sessions : 0
## Liczba braków danych w kolumnie Family_Income : 350
## Liczba braków danych w kolumnie Teacher_Quality : 78
## Liczba braków danych w kolumnie School_Type : 0
## Liczba braków danych w kolumnie Peer_Influence : 0
## Liczba braków danych w kolumnie Physical_Activity : 0
## Liczba braków danych w kolumnie Learning_Disabilities : 0
## Liczba braków danych w kolumnie Parental_Education_Level : 90
## Liczba braków danych w kolumnie Distance_from_Home : 67
## Liczba braków danych w kolumnie Gender : 0
## Liczba braków danych w kolumnie Exam_Score : 300
Zestaw posiada wiele braków danych, dlatego konieczne będzie dokonanie ich imputacji. Wszystkie zmienne zostały zimputowane za pomocą metody MICE, czyli wielowymiarowego wypełniania przez równania łańcuchowe.
# Imputacja zmiennej Sleep_Hours
imp1 <- imputate_na(dane, Sleep_Hours, Hours_Studied,
method = "mice", seed = 101)
##
## iter imp variable
## 1 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp1)
# Imputacja zmiennej Family_Income
imp2 <- imputate_na(dane, Family_Income, Extracurricular_Activities,
method = "mice", seed = 102)
##
## iter imp variable
## 1 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp2)
# Imputacja zmiennej Teacher_Quality
imp3 <- imputate_na(dane, Teacher_Quality, Previous_Scores,
method = "mice", seed = 103)
##
## iter imp variable
## 1 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp3)
# Imputacja zmiennej Parental_Education_Level
imp4 <- imputate_na(dane, Parental_Education_Level, Family_Income,
method = "mice", seed = 104)
##
## iter imp variable
## 1 1 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp4)
# Imputacja zmiennej Distance_from_Home
imp5 <- imputate_na(dane, Distance_from_Home, Sleep_Hours,
method = "mice", seed = 105)
##
## iter imp variable
## 1 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp5)
# Imputacja zmiennej Exam_Score
imp6 <- imputate_na(dane, Exam_Score, Previous_Scores,
method = "mice", seed = 106)
##
## iter imp variable
## 1 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
plot(imp6)
Jak widać na wykresach, metoda MICE zapewnia dobre dopasowanie do zestawu danych. Zatem można wprowadzić imputacje do zestawu danych.
# Imputacja zmiennej Sleep_Hours
dane$Sleep_Hours <- imputate_na(dane, Sleep_Hours, Hours_Studied,
method = "mice", seed = 101, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Sleep_Hours Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
# Imputacja zmiennej Family_Income
dane$Family_Income <- imputate_na(dane, Family_Income, Extracurricular_Activities,
method = "mice", seed = 102, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Family_Income Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
# Imputacja zmiennej Teacher_Quality
dane$Teacher_Quality <- imputate_na(dane, Teacher_Quality, Previous_Scores,
method = "mice", seed = 103, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Teacher_Quality Parental_Education_Level Distance_from_Home Exam_Score
# Imputacja zmiennej Parental_Education_Level
dane$Parental_Education_Level <- imputate_na(dane, Parental_Education_Level, Family_Income,
method = "mice", seed = 104, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Parental_Education_Level Distance_from_Home Exam_Score
## 1 2 Parental_Education_Level Distance_from_Home Exam_Score
## 1 3 Parental_Education_Level Distance_from_Home Exam_Score
## 1 4 Parental_Education_Level Distance_from_Home Exam_Score
## 1 5 Parental_Education_Level Distance_from_Home Exam_Score
## 2 1 Parental_Education_Level Distance_from_Home Exam_Score
## 2 2 Parental_Education_Level Distance_from_Home Exam_Score
## 2 3 Parental_Education_Level Distance_from_Home Exam_Score
## 2 4 Parental_Education_Level Distance_from_Home Exam_Score
## 2 5 Parental_Education_Level Distance_from_Home Exam_Score
## 3 1 Parental_Education_Level Distance_from_Home Exam_Score
## 3 2 Parental_Education_Level Distance_from_Home Exam_Score
## 3 3 Parental_Education_Level Distance_from_Home Exam_Score
## 3 4 Parental_Education_Level Distance_from_Home Exam_Score
## 3 5 Parental_Education_Level Distance_from_Home Exam_Score
## 4 1 Parental_Education_Level Distance_from_Home Exam_Score
## 4 2 Parental_Education_Level Distance_from_Home Exam_Score
## 4 3 Parental_Education_Level Distance_from_Home Exam_Score
## 4 4 Parental_Education_Level Distance_from_Home Exam_Score
## 4 5 Parental_Education_Level Distance_from_Home Exam_Score
## 5 1 Parental_Education_Level Distance_from_Home Exam_Score
## 5 2 Parental_Education_Level Distance_from_Home Exam_Score
## 5 3 Parental_Education_Level Distance_from_Home Exam_Score
## 5 4 Parental_Education_Level Distance_from_Home Exam_Score
## 5 5 Parental_Education_Level Distance_from_Home Exam_Score
# Imputacja zmiennej Distance_from_Home
dane$Distance_from_Home <- imputate_na(dane, Distance_from_Home, Sleep_Hours,
method = "mice", seed = 105, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Distance_from_Home Exam_Score
## 1 2 Distance_from_Home Exam_Score
## 1 3 Distance_from_Home Exam_Score
## 1 4 Distance_from_Home Exam_Score
## 1 5 Distance_from_Home Exam_Score
## 2 1 Distance_from_Home Exam_Score
## 2 2 Distance_from_Home Exam_Score
## 2 3 Distance_from_Home Exam_Score
## 2 4 Distance_from_Home Exam_Score
## 2 5 Distance_from_Home Exam_Score
## 3 1 Distance_from_Home Exam_Score
## 3 2 Distance_from_Home Exam_Score
## 3 3 Distance_from_Home Exam_Score
## 3 4 Distance_from_Home Exam_Score
## 3 5 Distance_from_Home Exam_Score
## 4 1 Distance_from_Home Exam_Score
## 4 2 Distance_from_Home Exam_Score
## 4 3 Distance_from_Home Exam_Score
## 4 4 Distance_from_Home Exam_Score
## 4 5 Distance_from_Home Exam_Score
## 5 1 Distance_from_Home Exam_Score
## 5 2 Distance_from_Home Exam_Score
## 5 3 Distance_from_Home Exam_Score
## 5 4 Distance_from_Home Exam_Score
## 5 5 Distance_from_Home Exam_Score
# Imputacja zmiennej Exam_Score
dane$Exam_Score <- imputate_na(dane, Exam_Score, Previous_Scores,
method = "mice", seed = 106, no_attrs = TRUE)
##
## iter imp variable
## 1 1 Exam_Score
## 1 2 Exam_Score
## 1 3 Exam_Score
## 1 4 Exam_Score
## 1 5 Exam_Score
## 2 1 Exam_Score
## 2 2 Exam_Score
## 2 3 Exam_Score
## 2 4 Exam_Score
## 2 5 Exam_Score
## 3 1 Exam_Score
## 3 2 Exam_Score
## 3 3 Exam_Score
## 3 4 Exam_Score
## 3 5 Exam_Score
## 4 1 Exam_Score
## 4 2 Exam_Score
## 4 3 Exam_Score
## 4 4 Exam_Score
## 4 5 Exam_Score
## 5 1 Exam_Score
## 5 2 Exam_Score
## 5 3 Exam_Score
## 5 4 Exam_Score
## 5 5 Exam_Score
Po wykonaniu tych imputacji usunięto wszystkie braki danych.
for(i in 1:ncol(dane)) {
cat("Liczba braków danych w kolumnie", names(dane[, i]), ":", sum(is.na(dane[ , i])), "\n")
}
## Liczba braków danych w kolumnie Hours_Studied : 0
## Liczba braków danych w kolumnie Attendance : 0
## Liczba braków danych w kolumnie Parental_Involvement : 0
## Liczba braków danych w kolumnie Access_to_Resources : 0
## Liczba braków danych w kolumnie Extracurricular_Activities : 0
## Liczba braków danych w kolumnie Sleep_Hours : 0
## Liczba braków danych w kolumnie Previous_Scores : 0
## Liczba braków danych w kolumnie Motivation_Level : 0
## Liczba braków danych w kolumnie Internet_Access : 0
## Liczba braków danych w kolumnie Tutoring_Sessions : 0
## Liczba braków danych w kolumnie Family_Income : 0
## Liczba braków danych w kolumnie Teacher_Quality : 0
## Liczba braków danych w kolumnie School_Type : 0
## Liczba braków danych w kolumnie Peer_Influence : 0
## Liczba braków danych w kolumnie Physical_Activity : 0
## Liczba braków danych w kolumnie Learning_Disabilities : 0
## Liczba braków danych w kolumnie Parental_Education_Level : 0
## Liczba braków danych w kolumnie Distance_from_Home : 0
## Liczba braków danych w kolumnie Gender : 0
## Liczba braków danych w kolumnie Exam_Score : 0
Należy sprawdzić czy po imputacji danych wciąż spełniają one reguły walidacji.
rules <- check_that(dane,
# Reguły dla zmiennej Hours_Studied
is.numeric(Hours_Studied), #1
Hours_Studied >= 0, #2
Hours_Studied <= 168, #3
# Reguły dla zmiennej Attendance
is.numeric(Attendance), #4
Attendance >= 0, #5
Attendance <= 100, #6
# Reguły dla zmiennej Parental_Involvement
is.factor(Parental_Involvement), #7
Parental_Involvement %in% c("Low", "Medium", "High"), #8
# Reguły dla zmiennej Access_to_Resources
is.factor(Access_to_Resources), #9
Access_to_Resources %in% c("Low", "Medium", "High"), #10
# Reguły dla zmiennej Extracurricular_Activities
is.factor(Extracurricular_Activities), #11
Extracurricular_Activities %in% c("No", "Yes"), #12
# Reguły dla zmiennej Sleep_Hours
is.numeric(Sleep_Hours), #13
Sleep_Hours >= 0, #14
Sleep_Hours <= 24, #15
# Reguły dla zmiennej Previous_Scores
is.numeric(Previous_Scores), #16
Previous_Scores >= 0, #17
Previous_Scores <= 100, #18
# Reguły dla zmiennej Motivation_Level
is.factor(Motivation_Level), #19
Motivation_Level %in% c("Low", "Medium", "High"), #20
# Reguły dla zmiennej Internet_Access
is.factor(Internet_Access), #21
Internet_Access %in% c("No", "Yes"), #22
# Reguły dla zmiennej Tutoring_Sessions
is.numeric(Tutoring_Sessions), #23
Tutoring_Sessions >= 0, #24
(Tutoring_Sessions - floor(Tutoring_Sessions)) == 0, #25
# Reguły dla zmiennej Family_Income
is.factor(Family_Income), #26
Family_Income %in% c("Low", "Medium", "High"), #27
# Reguły dla zmiennej Teacher_Quality
is.factor(Teacher_Quality), #28
Teacher_Quality %in% c("Low", "Medium", "High"), #29
# Reguły dla zmiennej School_Type
is.factor(School_Type), #30
School_Type %in% c("Public", "Private"), #31
# Reguły dla zmiennej Peer_Influence
is.factor(Peer_Influence), #32
Peer_Influence %in% c("Negative", "Neutral", "Positive"), #33
# Reguły dla zmiennej Physical_Activity
is.numeric(Physical_Activity), #34
Physical_Activity >= 0, #35
Physical_Activity <= 168, #36
# Reguły dla zmiennej Learning_Disabilities
is.factor(Learning_Disabilities), #37
Learning_Disabilities %in% c("No", "Yes"), #38
# Reguły dla zmiennej Parental_Education_Level
is.factor(Parental_Education_Level), #39
Parental_Education_Level %in% c("High School", "College", "Postgraduate"), #40
# Reguły dla zmiennej Distance_from_Home
is.factor(Distance_from_Home), #41
Distance_from_Home %in% c("Far", "Moderate", "Near"), #42
# Reguły dla zmiennej Gender
is.factor(Gender), #43
Gender %in% c("Female", "Male"), #44
# Reguły dla zmiennej Exam_Score
is.numeric(Exam_Score), #45
Exam_Score >= 0, #46
Exam_Score <= 100 #47
)
summary(rules)
## name items passes fails nNA error warning
## 1 V01 1 1 0 0 FALSE FALSE
## 2 V02 6607 6607 0 0 FALSE FALSE
## 3 V03 6607 6607 0 0 FALSE FALSE
## 4 V04 1 1 0 0 FALSE FALSE
## 5 V05 6607 6607 0 0 FALSE FALSE
## 6 V06 6607 6607 0 0 FALSE FALSE
## 7 V07 1 1 0 0 FALSE FALSE
## 8 V08 6607 6607 0 0 FALSE FALSE
## 9 V09 1 1 0 0 FALSE FALSE
## 10 V10 6607 6607 0 0 FALSE FALSE
## 11 V11 1 1 0 0 FALSE FALSE
## 12 V12 6607 6607 0 0 FALSE FALSE
## 13 V13 1 1 0 0 FALSE FALSE
## 14 V14 6607 6607 0 0 FALSE FALSE
## 15 V15 6607 6607 0 0 FALSE FALSE
## 16 V16 1 1 0 0 FALSE FALSE
## 17 V17 6607 6607 0 0 FALSE FALSE
## 18 V18 6607 6607 0 0 FALSE FALSE
## 19 V19 1 1 0 0 FALSE FALSE
## 20 V20 6607 6607 0 0 FALSE FALSE
## 21 V21 1 1 0 0 FALSE FALSE
## 22 V22 6607 6607 0 0 FALSE FALSE
## 23 V23 1 1 0 0 FALSE FALSE
## 24 V24 6607 6607 0 0 FALSE FALSE
## 25 V25 6607 6607 0 0 FALSE FALSE
## 26 V26 1 1 0 0 FALSE FALSE
## 27 V27 6607 6607 0 0 FALSE FALSE
## 28 V28 1 1 0 0 FALSE FALSE
## 29 V29 6607 6607 0 0 FALSE FALSE
## 30 V30 1 1 0 0 FALSE FALSE
## 31 V31 6607 6607 0 0 FALSE FALSE
## 32 V32 1 1 0 0 FALSE FALSE
## 33 V33 6607 6607 0 0 FALSE FALSE
## 34 V34 1 1 0 0 FALSE FALSE
## 35 V35 6607 6607 0 0 FALSE FALSE
## 36 V36 6607 6607 0 0 FALSE FALSE
## 37 V37 1 1 0 0 FALSE FALSE
## 38 V38 6607 6607 0 0 FALSE FALSE
## 39 V39 1 1 0 0 FALSE FALSE
## 40 V40 6607 6607 0 0 FALSE FALSE
## 41 V41 1 1 0 0 FALSE FALSE
## 42 V42 6607 6607 0 0 FALSE FALSE
## 43 V43 1 1 0 0 FALSE FALSE
## 44 V44 6607 6607 0 0 FALSE FALSE
## 45 V45 1 1 0 0 FALSE FALSE
## 46 V46 6607 6607 0 0 FALSE FALSE
## 47 V47 6607 6607 0 0 FALSE FALSE
## expression
## 1 is.numeric(Hours_Studied)
## 2 Hours_Studied - 0 >= -1e-08
## 3 Hours_Studied - 168 <= 1e-08
## 4 is.numeric(Attendance)
## 5 Attendance - 0 >= -1e-08
## 6 Attendance - 100 <= 1e-08
## 7 is.factor(Parental_Involvement)
## 8 Parental_Involvement %vin% c("Low", "Medium", "High")
## 9 is.factor(Access_to_Resources)
## 10 Access_to_Resources %vin% c("Low", "Medium", "High")
## 11 is.factor(Extracurricular_Activities)
## 12 Extracurricular_Activities %vin% c("No", "Yes")
## 13 is.numeric(Sleep_Hours)
## 14 Sleep_Hours - 0 >= -1e-08
## 15 Sleep_Hours - 24 <= 1e-08
## 16 is.numeric(Previous_Scores)
## 17 Previous_Scores - 0 >= -1e-08
## 18 Previous_Scores - 100 <= 1e-08
## 19 is.factor(Motivation_Level)
## 20 Motivation_Level %vin% c("Low", "Medium", "High")
## 21 is.factor(Internet_Access)
## 22 Internet_Access %vin% c("No", "Yes")
## 23 is.numeric(Tutoring_Sessions)
## 24 Tutoring_Sessions - 0 >= -1e-08
## 25 (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0
## 26 is.factor(Family_Income)
## 27 Family_Income %vin% c("Low", "Medium", "High")
## 28 is.factor(Teacher_Quality)
## 29 Teacher_Quality %vin% c("Low", "Medium", "High")
## 30 is.factor(School_Type)
## 31 School_Type %vin% c("Public", "Private")
## 32 is.factor(Peer_Influence)
## 33 Peer_Influence %vin% c("Negative", "Neutral", "Positive")
## 34 is.numeric(Physical_Activity)
## 35 Physical_Activity - 0 >= -1e-08
## 36 Physical_Activity - 168 <= 1e-08
## 37 is.factor(Learning_Disabilities)
## 38 Learning_Disabilities %vin% c("No", "Yes")
## 39 is.factor(Parental_Education_Level)
## 40 Parental_Education_Level %vin% c("High School", "College", "Postgraduate")
## 41 is.factor(Distance_from_Home)
## 42 Distance_from_Home %vin% c("Far", "Moderate", "Near")
## 43 is.factor(Gender)
## 44 Gender %vin% c("Female", "Male")
## 45 is.numeric(Exam_Score)
## 46 Exam_Score - 0 >= -1e-08
## 47 Exam_Score - 100 <= 1e-08
Wszystkie obserwacje spełniają reguły walidacji, więc można przejść do kolejnego etapu projektu.
W tym rozdziale przedstawione zostały różne formy wizualizacji danych. Wizualizacje oparte są na pakiecie ggplot2 oraz plotly. Przed stworzeniem wizualizacji zdefiniowano motyw, który będzie wykorzystywany we wszystkich wykresach, w celu ujednolicenia stylu.
my_theme <- theme_minimal() +
theme(plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
axis.title = element_text(size = 12),
axis.text = element_text(size = 11))
W tym podrozdziale przedstawiono wykresy pudełkowe dla zmiennych ilościowych zestawu danych. Najpierw zostały zdefiniowane poniższym kodem.
# Wykres pudełkowy godzin nauki
wykres1 <- ggplot(dane, aes(y = Hours_Studied)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy godzin nauki",
y = "Godziny nauki") +
my_theme
# Wykres pudełkowy wyników z egzaminu
wykres2 <- ggplot(dane, aes(y = Exam_Score)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy wyników z egzaminu",
y = "Wynik z egzaminu [%]") +
my_theme
# Wykres pudełkowy obecności
wykres3 <- ggplot(dane, aes(y = Attendance)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy obecności",
y = "Obecność [%]") +
my_theme
# Wykres pudełkowy średniej liczby godzin snu w ciągu nocy
wykres4 <- ggplot(dane, aes(y = Sleep_Hours)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy średniej liczby godzin snu w ciągu nocy",
y = "Średnia liczba godzin snu w ciągu nocy") +
my_theme
# Wykres pudełkowy wyników z poprzednich egzaminów
wykres5 <- ggplot(dane, aes(y = Previous_Scores)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy wyników z poprzednich egzaminów",
y = "Wyniki z poprzednich egzaminów [%]") +
my_theme
# Wykres pudełkowy liczby sesji korepetycji w miesiącu
wykres6 <- ggplot(dane, aes(y = Tutoring_Sessions)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy liczby sesji korepetycji w miesiącu",
y = "Liczba sesji korepetycji w miesiącu") +
my_theme
# Wykres pudełkowy średniej liczby godzin aktywności fizycznej w tygodniu
wykres7 <- ggplot(dane, aes(y = Physical_Activity)) +
geom_boxplot() +
labs(title = "Wykres pudełkowy średniej liczby godzin aktywności fizycznej w tygodniu",
y = "Średnia liczba godzin aktywności fizycznej w tygodniu") +
my_theme
Następnie przetworzono je do formy interaktywnej za pomocą pakietu plotly.
ggplotly(wykres1)
ggplotly(wykres2)
ggplotly(wykres3)
ggplotly(wykres4)
ggplotly(wykres5)
ggplotly(wykres6)
ggplotly(wykres7)
W tym podrozdziale przedstawione zostały rozkłady zmiennych ilościowych za pomocą histogramów. Najpierw wykresy zostaną zdefiniowane, a następnie zwizualizowane za pomocą pakietu plotly.
# Histogram godzin nauki w tygodniu
wykres8 <- ggplot(dane, aes(x = Hours_Studied)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Histogram godzin nauki w tygodniu",
x = "Liczba godzin nauki",
y = "Liczba osób") +
my_theme
# Histogram obecności na zajęciach
wykres9 <- ggplot(dane, aes(x = Attendance)) +
geom_histogram(binwidth = 5, fill = "red", color = "black", alpha = 0.7) +
labs(title = "Histogram obecności na zajęciach",
x = "Obecność [%]",
y = "Liczba osób") +
my_theme
# Histogram średniej liczby godzin snu w ciągu nocy
wykres10 <- ggplot(dane, aes(x = Sleep_Hours)) +
geom_histogram(binwidth = 1, fill = "pink", color = "black", alpha = 0.7) +
labs(title = "Histogram średniej liczby godzin snu w ciągu nocy",
x = "Liczba godzin snu",
y = "Liczba osób") +
my_theme
# Histogram wyników z poprzednich egzaminów
wykres11 <- ggplot(dane, aes(x = Previous_Scores)) +
geom_histogram(binwidth = 5, fill = "green", color = "black", alpha = 0.7) +
labs(title = "Histogram wyników z poprzednich egzaminów",
x = "Wyniki [%]",
y = "Liczba osób") +
my_theme
# Histogram liczby sesji korepetycji w miesiącu
wykres12 <- ggplot(dane, aes(x = Tutoring_Sessions)) +
geom_histogram(binwidth = 1, fill = "purple", color = "black", alpha = 0.7) +
labs(title = "Histogram liczby sesji korepetycji w miesiącu",
x = "Liczba sesji",
y = "Liczba osób") +
my_theme
# Histogram średniej liczby godzin aktywności fizycznej w tygodniu
wykres13 <- ggplot(dane, aes(x = Physical_Activity)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Histogram średniej liczby godzin aktywności fizycznej w tygodniu",
x = "Liczba godzin",
y = "Liczba osób") +
my_theme
# Histogram wyników z egzaminu
wykres14 <- ggplot(dane, aes(x = Exam_Score)) +
geom_histogram(binwidth = 5, fill = "brown", color = "black", alpha = 0.7) +
labs(title = "Histogram wyników z egzaminu",
x = "Wynik [%]",
y = "Liczba osób") +
my_theme
ggplotly(wykres8)
ggplotly(wykres9)
ggplotly(wykres10)
ggplotly(wykres11)
ggplotly(wykres12)
ggplotly(wykres13)
ggplotly(wykres14)
W tym podrozdziale przedstawiono wykresy kolumnowe dla zmiennych jakościowych. Ponownie w pierwszej kolejności zostaną one zdefiniowane, a następnie zwizualizowane w interaktywny sposób.
# parental involvement - wykres
wykres15 <- ggplot(dane, aes(x = Parental_Involvement, fill = Parental_Involvement)) +
geom_bar(color = "black") +
labs(title = "Zaangażowanie rodziców", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# access to resources - wykres
wykres16 <- ggplot(dane, aes(x = Access_to_Resources, fill = Access_to_Resources)) +
geom_bar(color = "black") +
labs(title = "Dostęp do zasobów", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# extracurricular activities - wykres
wykres17 <- ggplot(dane, aes(x = Extracurricular_Activities,
fill = Extracurricular_Activities)) +
geom_bar(color = "black") +
labs(title = "Udział w zajęciach pozalekcyjnych", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# motivation level - wykres
wykres18 <- ggplot(dane, aes(x = Motivation_Level, fill = Motivation_Level)) +
geom_bar(color = "black") +
labs(title = "Poziom motywacji", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# internet access - wykres
wykres19 <- ggplot(dane, aes(x = Internet_Access, fill = Internet_Access)) +
geom_bar(color = "black") +
labs(title = "Dostęp do internetu", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# family income - wykres
wykres20 <- ggplot(dane, aes(x = Family_Income, fill = Family_Income)) +
geom_bar(color = "black") +
labs(title = "Dochód rodziny", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# teacher quality - wykres
wykres21 <- ggplot(dane, aes(x = Teacher_Quality, fill = Teacher_Quality)) +
geom_bar(color = "black") +
labs(title = "Jakość nauczania", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# school type - wykres
wykres22 <- ggplot(dane, aes(x = School_Type, fill = School_Type)) +
geom_bar(color = "black") +
labs(title = "Rodzaj szkoły", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# peer influence - wykres
wykres23 <- ggplot(dane, aes(x = Peer_Influence, fill = Peer_Influence)) +
geom_bar(color = "black") +
labs(title = "Wpływ rówieśników", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# learning disabilities - wykres
wykres24 <- ggplot(dane, aes(x = Learning_Disabilities, fill = Learning_Disabilities)) +
geom_bar(color = "black") +
labs(title = "Występowanie trudności w uczeniu się", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# parental education level - wykres
wykres25 <- ggplot(dane, aes(x = Parental_Education_Level, fill = Parental_Education_Level)) +
geom_bar(color = "black") +
labs(title = "Poziom wykształcenia rodziców", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# distance from home - wykres
wykres26 <- ggplot(dane, aes(x = Distance_from_Home, fill = Distance_from_Home)) +
geom_bar(color = "black") +
labs(title = "Odległość od domu", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
# gender - wykres
wykres27 <- ggplot(dane, aes(x = Gender, fill = Gender)) +
geom_bar(color = "black") +
labs(title = "Płeć", x = NULL, y = "Liczba wystąpień") +
my_theme + theme(legend.position = "none")
ggplotly(wykres15)
ggplotly(wykres16)
ggplotly(wykres17)
ggplotly(wykres18)
ggplotly(wykres19)
ggplotly(wykres20)
ggplotly(wykres21)
ggplotly(wykres22)
ggplotly(wykres23)
ggplotly(wykres24)
ggplotly(wykres25)
ggplotly(wykres26)
ggplotly(wykres27)
Jako ostatnie przedstawiono wykresy punktowe. Każdorazowo przedstawiają one zależność między jedną zmienną a wynikami z egzaminu (Exam_Score). Procedura jest taka sama jak w poprzednich podrozdziałach.
wykres28 <- ggplot(dane, aes(x = Hours_Studied, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "red") +
labs(title = "Wynik egzaminu w zależności od liczby godzin spędzonych na nauce",
x = "Liczba godzin nauki [h]",
y = "Wynik z egzaminu [%]") +
my_theme
wykres29 <- ggplot(dane, aes(x = Attendance, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "black") +
labs(title = "Wynik egzaminu w zależności od obecności",
x = "Obecność [%]",
y = "Wynik z egzaminu [%]") +
my_theme
wykres30 <- ggplot(dane, aes(x = Parental_Involvement, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "purple") +
labs(title = "Wynik egzaminu w zależności od zaangażowania rodziców",
x = "Zaangażowanie rodziców",
y = "Wynik z egzaminu [%]") +
my_theme
wykres31 <- ggplot(dane, aes(x = Access_to_Resources, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "grey") +
labs(title = "Wynik egzaminu w zależności od od dostępu do zasobów naukowych",
x = "Dostęp do zasobów",
y = "Wynik z egzaminu [%]") +
my_theme
wykres32 <- ggplot(dane, aes(x = Extracurricular_Activities, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "pink") +
labs(title = "Wynik egzaminu w zależności od liczby zajęć pozalekcyjnych",
x = "Zajęcia pozalekcyjne",
y = "Wynik z egzaminu [%]") +
my_theme
wykres33 <- ggplot(dane, aes(x = Sleep_Hours, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "blue") +
labs(title = "Wynik egzaminu w zależności od liczby godzin snu",
x = "Liczba godzin snu [h]",
y = "Wynik z egzaminu [%]") +
my_theme
wykres34 <- ggplot(dane, aes(x = Previous_Scores, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "green") +
labs(title = "Wynik egzaminu w zależności od poprzednich wyników z egzaminu",
x = "Poprzednie wyniki z egzaminu [%]",
y = "Wynik z egzaminu [%]") +
my_theme
wykres35 <- ggplot(dane, aes(x = Motivation_Level, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "yellow") +
labs(title = "Wynik egzaminu w zależności od poziomu motywacji",
x = "Poziom motywacji",
y = "Wynik z egzaminu [%]") +
my_theme
wykres36 <- ggplot(dane, aes(x = Internet_Access, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "brown") +
labs(title = "Wynik egzaminu w zależności od dostępu do internetu",
x = "Dostęp do internetu",
y = "Wynik z egzaminu [%]") +
my_theme
wykres37 <- ggplot(dane, aes(x = Tutoring_Sessions, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "orange") +
labs(title = "Wynik egzaminu w zależności od ilości korepetycji",
x = "Ilość korepetycji",
y = "Wynik z egzaminu [%]") +
my_theme
wykres38 <- ggplot(dane, aes(x = Family_Income, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "lightblue") +
labs(title = "Wynik egzaminu w zależności od zarobku rodziny",
x = "Zarobek rodziny",
y = "Wynik z egzaminu [%]") +
my_theme
wykres39 <- ggplot(dane, aes(x = Teacher_Quality, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "lightgreen") +
labs(title = "Wynik egzaminu w zależności od jakości kształcenia",
x = "Jakość kształcenia",
y = "Wynik z egzaminu [%]") +
my_theme
wykres40 <- ggplot(dane, aes(x = School_Type, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "darkgreen") +
labs(title = "Wynik egzaminu w zależności od wybranego rodzaju szkoły",
x = "Rodzaj szkoły",
y = "Wynik z egzaminu [%]") +
my_theme
wykres41 <- ggplot(dane, aes(x = Peer_Influence, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "darkred") +
labs(title = "Wynik egzaminu w zależności od wpływu rówieśników",
x = "Wpływ rówieśników",
y = "Wynik z egzaminu [%]") +
my_theme
wykres42 <- ggplot(dane, aes(x = Physical_Activity, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "darkblue") +
labs(title = "Wynik egzaminu w zależności od liczby godzin spędzonych na aktywności fizycznej",
x = "Aktywność fizyczna [h]",
y = "Wynik z egzaminu [%]") +
my_theme
wykres43 <- ggplot(dane, aes(x = Learning_Disabilities, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "darkorange") +
labs(title = "Wynik egzaminu w zależności od niepełnosprawności",
x = "Niepełnosprawność",
y = "Wynik z egzaminu [%]") +
my_theme
wykres44 <- ggplot(dane, aes(x = Parental_Education_Level, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "lightpink") +
labs(title = "Wynik egzaminu w zależności od wykształcenia rodziców",
x = "Wykształcenie rodziców",
y = "Wynik z egzaminu [%]") +
my_theme
wykres45 <- ggplot(dane, aes(x = Distance_from_Home, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "lightgrey") +
labs(title = "Wynik egzaminu w zależności od odległości od domu",
x = "Odległość od domu",
y = "Wynik z egzaminu [%]") +
my_theme
wykres46 <- ggplot(dane, aes(x = Gender, y = Exam_Score)) +
geom_point(size = 3, alpha = 0.1, colour = "darkgrey") +
labs(title = "Wynik egzaminu w zależności od płci",
x = "Płeć",
y = "Wynik z egzaminu [%]") +
my_theme
ggplotly(wykres28)
ggplotly(wykres29)
ggplotly(wykres30)
ggplotly(wykres31)
ggplotly(wykres32)
ggplotly(wykres33)
ggplotly(wykres34)
ggplotly(wykres35)
ggplotly(wykres36)
ggplotly(wykres37)
ggplotly(wykres38)
ggplotly(wykres39)
ggplotly(wykres40)
ggplotly(wykres41)
ggplotly(wykres42)
ggplotly(wykres43)
ggplotly(wykres44)
ggplotly(wykres45)
ggplotly(wykres46)
Kolejnym etapem projektu było wykonanie analizy opisowej danych. W tym celu obliczono statystyki opisowe dla zmiennych ilościowych i korelacje dla zmiennych ilościowych oraz jakościowych.
Poniżej przedstawiono statystyki opisowe dla zmmiennych ilościowych. Obliczone zostały: średnia arytmetyczna, odchylenie standardowe, rozstęp międzykwartylowy, współczynnik zmienności, skośność, kurtoza oraz wszystkie kwartyle, w tym mediana.
stat_opisowe <- dane %>%
select(where(is.numeric)) %>%
numSummary(statistics = c("mean", "sd", "IQR", "CV", "quantiles",
"skewness", "kurtosis"))
## Warning in CV(X): not all values are positive
round(stat_opisowe$table, 3)
## mean sd IQR CV skewness kurtosis 0% 25% 50% 75% 100%
## Hours_Studied 19.975 5.991 8 0.300 0.013 0.018 1 16 20 24 44
## Attendance 79.977 11.547 20 0.144 0.014 -1.194 60 70 80 90 100
## Sleep_Hours 7.027 1.439 2 0.205 -0.020 -0.424 4 6 7 8 10
## Previous_Scores 75.071 14.400 25 0.192 -0.004 -1.191 50 63 75 88 100
## Tutoring_Sessions 1.494 1.231 1 0.824 0.816 0.644 0 1 1 2 8
## Physical_Activity 2.968 1.031 2 0.347 -0.031 -0.059 0 2 3 4 6
## Exam_Score 67.222 3.815 4 0.057 1.604 10.584 56 65 67 69 100
Poniżej przedstawione zostały korelacje pomiędzy zmiennymi ilościowymi, wyznaczone za pomocą współczynnika korelacji r Pearsona.
dane %>%
select(where(is.numeric)) %>%
cor()
## Hours_Studied Attendance Sleep_Hours Previous_Scores
## Hours_Studied 1.000000000 -0.009907859 0.0088745847 0.02484578
## Attendance -0.009907859 1.000000000 -0.0160910091 -0.02018610
## Sleep_Hours 0.008874585 -0.016091009 1.0000000000 -0.02145357
## Previous_Scores 0.024845782 -0.020186103 -0.0214535720 1.00000000
## Tutoring_Sessions -0.014282264 0.014323509 -0.0154707591 -0.01312233
## Physical_Activity 0.004624390 -0.022434703 -0.0003700937 -0.01127373
## Exam_Score 0.446015481 0.583875961 -0.0206054665 0.17076398
## Tutoring_Sessions Physical_Activity Exam_Score
## Hours_Studied -0.01428226 0.0046243903 0.44601548
## Attendance 0.01432351 -0.0224347027 0.58387596
## Sleep_Hours -0.01547076 -0.0003700937 -0.02060547
## Previous_Scores -0.01312233 -0.0112737339 0.17076398
## Tutoring_Sessions 1.00000000 0.0177329453 0.15287689
## Physical_Activity 0.01773295 1.0000000000 0.03016639
## Exam_Score 0.15287689 0.0301663887 1.00000000
Poniżej przedstawiono macierz korelacji dla zmiennych ilościowych. Korelacje obliczone zostały za pomocą współczynnika korelacji r Pearsona.
cor_matrix <- dane %>%
select(where(is.numeric)) %>%
cor()
cor_matrix <- cor(dane[, c("Hours_Studied", "Attendance", "Sleep_Hours",
"Previous_Scores", "Tutoring_Sessions",
"Physical_Activity", "Exam_Score")],
use = "pairwise.complete.obs")
corrplot(cor_matrix, method = "color", tl.cex = 0.8, addCoef.col = "black")
Poniżej zaprezentowano macierz korelacji zmiennych jakościowych.
# Filtracja danych jakościowych
dane_cor <- dane %>%
select(where(is.factor))
# Przygotowanie argumentu do obliczenia korelacji
categorical_vars <- c("Parental_Involvement", "Access_to_Resources",
"Extracurricular_Activities", "Motivation_Level",
"Internet_Access", "Family_Income", "Teacher_Quality",
"School_Type", "Peer_Influence",
"Learning_Disabilities", "Parental_Education_Level",
"Distance_from_Home", "Gender")
# Definiowanie funkcji do obliczenia wartości współczynnika V Cramera
calculate_cramer_v <- function(var1, var2) {
contingency_table <- table(var1, var2)
cramer_v_result <- assocstats(contingency_table)$cramer
return(cramer_v_result)
}
# Przygotowanie pustej macierzy, w której zostaną zapisane wyniki
cramer_matrix <- matrix(NA, nrow = length(categorical_vars), ncol = length(categorical_vars),
dimnames = list(categorical_vars, categorical_vars))
# Obliczanie Cramera dla każdej pary zmiennych
for (i in 1:(length(categorical_vars) - 1)) {
for (j in (i + 1):length(categorical_vars)) {
var1 <- categorical_vars[i]
var2 <- categorical_vars[j]
cramer_matrix[i, j] <- calculate_cramer_v(dane_cor[[var1]], dane_cor[[var2]])
cramer_matrix[j, i] <- cramer_matrix[i, j]
}
}
# Wizualizacja macierzy Cramera
corrplot(cramer_matrix, method = "color", tl.cex = 0.8, addCoef.col = "black")
W tym rozdziale wykonane zostanie wnioskowanie statystyczne. Podzielono je na dwie części: dla zmiennych ilościowych i jakościowych.
W tym podrozdziale przeprowadzone zostały testy statystyczne dla zmiennych ilościowych. Konkretnie badane jest, czy zmienne ilościowe z zestawu danych wpływają na wyniki egzaminu. Hipoteza zerowa zakłada, że nie ma takiego wpływu (jest on zerowy), natomiast hipoteza alternatywna mówi, że istnieje istotna statystycznie zależność. Stosowanym poziomem istotności alfa będzie 0,05.
Na początku sprawdzona zostanie normalność rozkładu zmiennej ocen z egzaminu. Hipoteza zerowa zakłada, że rozkład jest normalny, a hipoteza alternatywna - że nie jest. Zastosowano test Kołmogorowa-Smirnowa oraz test Andersona-Darlinga.
lillie.test(dane$Exam_Score)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dane$Exam_Score
## D = 0.080473, p-value < 2.2e-16
ad.test(dane$Exam_Score)
##
## Anderson-Darling normality test
##
## data: dane$Exam_Score
## A = 47.115, p-value < 2.2e-16
P-value z obu testów jest niższe od poziomu istotności alfa wynoszącego 0,05, więc odrzucamy hipotezę zerową na rzecz hipotezy alternatywnej. Oznacza to, że wyniki z egzaminu nie mają rozkładu normalnego.
Na podstawie wykresów pudełkowych z podrozdziału 2.1 można powiedzieć, że w zmiennej Exam_Score występuje wiele wartości odstających. W tych warunkach nie będzie można skorzystać z testów parametrycznych zakładających normalność i symetrię rozkładu. Zastosowane zostaną więc testy odporne (robust).
# hours studied - wplyw
ggscatterstats(data = dane, x = Hours_Studied, y = Exam_Score, type = "r")
## Registered S3 method overwritten by 'ggside':
## method from
## +.gg ggplot2
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value z testu jest niezwykle niskie, wynosi 1,37E-304. Jest to wartość mniejsza od poziomu istotności, więc należy odrzucić hipotezę zerową. Istnieje zależność pomiędzy liczbą godzin nauki a wynikiem z egzaminu.
# attendance - wplyw
ggscatterstats(data = dane, x = Attendance, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value z testu jest niższe od poziomu istotności, więc odrzucamy hipotezę zerową na rzecz hipotezy alternatywnej. Zatem istnieje zależność pomiędzy obecnością na zajęciach a oceną z egzaminu.
# sleep hours - wplyw
ggscatterstats(data = dane, x = Sleep_Hours, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value z testu wynosi 0,83, więc jest większe od poziomu istotności. Zatem nie ma podstaw do odrzucenia hipotezy zerowej o braku statystycznie istotnej zależności między średnią liczbą godzin snu a wynikiem z egzaminu.
# previous scores - wplyw
ggscatterstats(data = dane, x = Previous_Scores, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value z testu jest niższe od poziomu istotności alfa, więc istnieją podstawy do odrzucenia hipotezy zerowej. Istnieje więc zależność pomiędzy wcześniejszymi wynikami z egzaminów a wynikiem z egzaminu końcowego.
# tutoring sessions - wplyw
ggscatterstats(data = dane, x = Tutoring_Sessions, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value jest mniejsze od poziomu istotności, więc są podstawy do odrzucenia hipotezy zerowej. Istnieje zależność pomiędzy liczbą godzin korepetycji a wynikami z egzaminu.
# physical activity - wplyw
ggscatterstats(data = dane, x = Physical_Activity, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.
P-value z testu wynosi 0,06, więc na poziomie istotności alfa równym 0,05 nie ma podstaw do odrzucenia hipotezy zerowej o braku zależności pomiędzy średnią liczbą godzin aktywności fizycznej a wynikami z egzaminu.
W tym podrozdziale zostały przeprowadzone testy statystyczne dla zmiennych jakościowych. Badają powiązane konkretnych zmiennych z wynikami egzaminów. Hipoteza zerowa mówi, że nie ma powiązania pomiędzy zmiennymi, natomiast hipoteza alternatywna mówi, że istnieje istotna statystycznie zależność. Poziom istotności ponownie będzie wynosił 0,05. Ponownie ze względu na brak rozkładu normalnego i asymetrii rozkładu zmiennej Exam_Score zastosowane zostały testy odporne (robust).
ggbetweenstats(
data = dane,
x = Parental_Involvement,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje istotne statystycznie powiązanie między poziomem zaangażowania rodziców a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Access_to_Resources,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy dostępem do zasobów a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = Extracurricular_Activities,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wykonywaniem aktywności dodatkowych a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = Motivation_Level,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy poziomem motywacji a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = Internet_Access,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy dostępem do Internetu a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = Family_Income,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy poziomem dochodów rodziny a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = Teacher_Quality,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy jakością nauczycieli a wynikami uczniów z egzaminów.
ggbetweenstats(
data = dane,
x = School_Type,
y = Exam_Score,
type = "r"
)
P-value wynosi 0,74, a więc jest wyższe od poziomu istotności. Oznacza to, że nie ma podstaw do odrzucenia hipotezy zerowej. Zatem nie ma istotnie statystycznego powiązania pomiędzy rodzajem szkoły a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Peer_Influence,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wpływem rówieśników a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Learning_Disabilities,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy obecnością trudności w uczeniu się a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Parental_Education_Level,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wykształceniem rodziców a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Distance_from_Home,
y = Exam_Score,
type = "r"
)
P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy odległością od domu a wynikami uczniów z egzaminu.
ggbetweenstats(
data = dane,
x = Gender,
y = Exam_Score,
type = "r"
)
P-value wynosi 0,51, a więc jest wyższe od poziomu istotności. Oznacza to, że nie ma podstaw do odrzucenia hipotezy zerowej. Zatem nie ma istotnie statystycznego powiązania pomiędzy płcią a wynikami uczniów z egzaminu.
Jako ostatni etap projektu wykonano analizę za pomocą modelowania ekonometrycznego. Badany będzie wpływ różnych zmiennych z zestawu danych na wyniki uczniów z egzaminu. Zatem zmienną objaśnianą będzie zmienna Exam_Score, a zmiennymi objaśniającymi będą wszystkie zmienne, które w poprzednim rozdziale uznano za powiązane z wynikami egzaminów.
dane_imp <- read_csv("czynniki-imputowane.csv")
## Rows: 6607 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (13): Parental_Involvement, Access_to_Resources, Extracurricular_Activit...
## dbl (7): Hours_Studied, Attendance, Sleep_Hours, Previous_Scores, Tutoring_...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
dane_imp$Exam_Score <- ifelse(dane_imp$Exam_Score > 100, 100, dane_imp$Exam_Score)
model1 <- lm(formula = Exam_Score ~
Hours_Studied + Attendance + Parental_Involvement +
Access_to_Resources + Extracurricular_Activities +
Previous_Scores + Motivation_Level + Internet_Access +
Tutoring_Sessions + Family_Income + Teacher_Quality +
Peer_Influence + Learning_Disabilities +
Parental_Education_Level + Distance_from_Home,
data = dane_imp)
summary(model1)
##
## Call:
## lm(formula = Exam_Score ~ Hours_Studied + Attendance + Parental_Involvement +
## Access_to_Resources + Extracurricular_Activities + Previous_Scores +
## Motivation_Level + Internet_Access + Tutoring_Sessions +
## Family_Income + Teacher_Quality + Peer_Influence + Learning_Disabilities +
## Parental_Education_Level + Distance_from_Home, data = dane_imp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.2539 -0.4832 -0.1580 0.1619 29.8638
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42.792940 0.288419 148.371 < 2e-16 ***
## Hours_Studied 0.290412 0.004176 69.549 < 2e-16 ***
## Attendance 0.195285 0.002168 90.093 < 2e-16 ***
## Parental_InvolvementLow -1.896650 0.072586 -26.130 < 2e-16 ***
## Parental_InvolvementMedium -0.985927 0.058259 -16.923 < 2e-16 ***
## Access_to_ResourcesLow -1.989673 0.072410 -27.478 < 2e-16 ***
## Access_to_ResourcesMedium -0.962888 0.057753 -16.673 < 2e-16 ***
## Extracurricular_ActivitiesYes 0.552460 0.051007 10.831 < 2e-16 ***
## Previous_Scores 0.046051 0.001739 26.481 < 2e-16 ***
## Motivation_LevelLow -1.018916 0.072594 -14.036 < 2e-16 ***
## Motivation_LevelMedium -0.537594 0.066117 -8.131 5.05e-16 ***
## Internet_AccessYes 0.886869 0.094637 9.371 < 2e-16 ***
## Tutoring_Sessions 0.479366 0.020314 23.598 < 2e-16 ***
## Family_IncomeLow -0.989240 0.068851 -14.368 < 2e-16 ***
## Family_IncomeMedium -0.504825 0.069075 -7.308 3.02e-13 ***
## Teacher_QualityLow -0.970292 0.090982 -10.665 < 2e-16 ***
## Teacher_QualityMedium -0.481692 0.055840 -8.626 < 2e-16 ***
## Peer_InfluenceNeutral 0.500333 0.067827 7.377 1.82e-13 ***
## Peer_InfluencePositive 0.978517 0.067576 14.480 < 2e-16 ***
## Learning_DisabilitiesYes -0.820549 0.081494 -10.069 < 2e-16 ***
## Parental_Education_LevelHigh School -0.435232 0.057547 -7.563 4.47e-14 ***
## Parental_Education_LevelPostgraduate 0.472484 0.071853 6.576 5.21e-11 ***
## Distance_from_HomeModerate 0.397690 0.090610 4.389 1.16e-05 ***
## Distance_from_HomeNear 0.876445 0.085033 10.307 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.03 on 6583 degrees of freedom
## Multiple R-squared: 0.7186, Adjusted R-squared: 0.7177
## F-statistic: 731.1 on 23 and 6583 DF, p-value: < 2.2e-16
W tym podrozdziale została przedstawiona diagnostyka stworzonego modelu.
Na podstawie współczynnika determinacji (statystyki R-kwadrat) można powiedzieć, że model tłumaczy 71,86% zmienności ocen uczniów z egzaminu.
Testując przydatność modelu, hipoteza zerowa mówi, że model nie jest istotny statystycznie, natomiast hipoteza alternatywna mówi, że jest. Na podstawie testu F można określić, że p-value z tego testu jest niższe od poziomu istotności alfa równego 0,05, co oznacza, że istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej, co oznacza, że model jest przydatny.
Testując czy rozkład składnika resztowego jest rozkładem normalnym, hipoteza zerowa mówi, że rozkład jest rozkładem normalnym, a hipoteza alternatywna mówi, że nie jest. Można tu wykorzystać test Kołmogorowa-Smirnowa.
lillie.test(model1$residuals)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: model1$residuals
## D = 0.32292, p-value < 2.2e-16
P-value z testu jest niższe od poziomu istotności, więc istnieją podstawy, by odrzucić hipotezę zerową na rzecz alternatywnej. Rozkład reszt nie jest rozkładem normalnym. Zatem następnym krokiem jest sprawdzenie jak wygląda rozkład składnika resztowego.
reszty <- tibble(res = model1$residuals)
ggplot(reszty, aes(x = res)) +
geom_histogram(bins = 50, colour = "black", fill = "firebrick") +
labs(x = "Reszty modelu",
y = "Liczebność") +
my_theme
Jak widać na wykresie, reszty są bardzo silnie skupione wokół zera, z czego najprawdopodobniej wynika, że nie jest to rozkład normalny.
Następnie można sprawdzić, czy reszty zachowują stałość wariancji (homoskedastyczność). Hipoteza zerowa mówi, że reszty zachowują stałość wariancji (są homoskedastyczne), natomiast hipoteza alternatywna mówi, że nie zachowują stałości wariancji (są heteroskedastyczne). Wykorzystany do tego zostanie test White’a.
ncvTest(model1)
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 18.52631, Df = 1, p = 1.6757e-05
P-value z testu White’a jest niższe od poziomu istotności, co oznacza, że są podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Reszty modelu nie zachowują stałości wariancji, czyli są heteroskedastyczne.
Następnie można sprawdzić, czy zmienne w modelu są współliniowe, co sugerowałoby potrzebę usunięcia tych zmiennych.
vif(model1)
## GVIF Df GVIF^(1/(2*Df))
## Hours_Studied 1.003003 1 1.001501
## Attendance 1.004245 1 1.002120
## Parental_Involvement 1.007099 2 1.001770
## Access_to_Resources 1.006713 2 1.001674
## Extracurricular_Activities 1.004270 1 1.002133
## Previous_Scores 1.005174 1 1.002583
## Motivation_Level 1.008078 2 1.002013
## Internet_Access 1.002516 1 1.001257
## Tutoring_Sessions 1.001612 1 1.000806
## Family_Income 1.006267 2 1.001563
## Teacher_Quality 1.006669 2 1.001663
## Peer_Influence 1.007046 2 1.001757
## Learning_Disabilities 1.002156 1 1.001077
## Parental_Education_Level 1.005444 2 1.001358
## Distance_from_Home 1.004671 2 1.001166
Wszystkie wartości VIF są bardzo bliskie 1, co oznacza, że zmienne zawarte w modelu nie są ze sobą skorelowane w żaden sposób, co jest pozytywne z punktu widzenia modelu.
Ostatecznie można ocenić, że model nie jest złym modelem, ze względu na dość wysoki R-kwadrat oraz brak współliniowości zmiennych. Nie spełnia on jednak założenia normalności rozkładu reszt oraz homoskedastyczności reszt. Sugeruje to, że istnieją inne czynniki, niezawarte w tym zbiorze danych, które wpływają na wyniki uczniów z egzaminów.
Interpretacja współczynników modelu:
Wzrost liczby godzin nauki o 1 godzinę powoduje wzrost wyniku z egzaminu średnio o 0,29 p.p., ceteris paribus.
Wzrost odsetka obecności o 1 p.p. powoduje wzrost wyniku z egzaminu średnio o 0,2 p.p., ceteris paribus.
Uczniowie o niskim poziomie zaangażowania rodziców mają średnio o 1,9 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie zaangażowania rodziców, ceteris paribus.
Uczniowie o średnim poziomie zaangażowania rodziców mają średnio o 0,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie zaangażowania rodziców, ceteris paribus.
Uczniowie o niskim poziomie dostępu do zasobów mają średnio o 1,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dostępu do zasobów, ceteris paribus.
Uczniowie o średnim poziomie dostępu do zasobów mają średnio o 0,96 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dostępu do zasobów, ceteris paribus.
Uczniowie biorący udział w zajęciach pozalekcyjnych mają średnio o 0,55 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy nie biorą udziału w żadnych zajęciach pozalekcyjnych, ceteris paribus.
Wzrost wyniku z poprzedniego egzaminu o 1 p.p. powoduje wzrost wyniku z egzaminu średnio o 0,05 p.p., ceteris paribus.
Uczniowie o niskim poziomie motywacji mają średnio o 1,02 p.p. niższy wynik z egzaminu niż uczniowie o wysokim poziomie motywacji, ceteris paribus.
Uczniowie o średnim poziomie motywacji mają średnio o 0,54 p.p. niższy wynik z egzaminu niż uczniowie o wysokim poziomie motywacji, ceteris paribus.
Uczniowie z dostępem do Internetu mają średnio o 0,89 p.p. wyższy wynik z egzaminu niż uczniowie bez dostępu do Internetu, ceteris paribus.
Wzrost liczby godzin korepetycji o 1 godzinę powoduje wzrost wyniku z egzaminu średnio o 0,48 p.p., ceteris paribus.
Uczniowie o niskim poziomie dochodu w rodzinie mają średnio o 0,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dochodów w rodzinie, ceteris paribus.
Uczniowie o średnim poziomie dochodu w rodzinie mają średnio o 0,5 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dochodów w rodzinie, ceteris paribus.
Uczniowie o niskiej jakości nauczycieli mają średnio o 0,97 p.p. niższe wyniki z egzaminu niż uczniowie o wysokiej jakości nauczycieli, ceteris paribus.
Uczniowie o średniej jakości nauczycieli mają średnio o 0,48 p.p. niższe wyniki z egzaminu niż uczniowie o wysokiej jakości nauczycieli, ceteris paribus.
Uczniowie o neutralnym wpływie rówieśników mają średnio o 0,5 p.p. wyższe wyniki z egzaminu niż uczniowie o negatywnym wpływie rówieśników, ceteris paribus.
Uczniowie o pozytywnym wpływie rówieśników mają średnio o 0,98 p.p. wyższe wyniki z egzaminu niż uczniowie o negatywnym wpływie rówieśników, ceteris paribus.
Uczniowie posiadający trudności w uczeniu się mają średnio o 0,82 p.p. niższe wyniki z egzaminu niż uczniowie, którzy ich nie posiadają, ceteris paribus.
Uczniowie, których rodzice mają maksymalnie wykształcenie szkoły średniej mają średnio o 0,44 p.p. niższe wyniki z egzaminu niż uczniowie, których rodzice mają maksymalnie wykształcenie z uczelni wyższej, ceteris paribus.
Uczniowie, których rodzice mają maksymalnie wykształcenie ze studiów podyplomowych mają średnio o 0,47 p.p. wyższe wyniki z egzaminu niż uczniowie, których rodzice mają maksymalnie wykształcenie z uczelni wyższej, ceteris paribus.
Uczniowie, którzy mają umiarkowaną odległość szkoły od miejsca zamieszkania mają średnio o 0,4 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy mają daleko do szkoły, ceteris paribus.
Uczniowie, którzy mają blisko do szkoły od miejsca zamieszkania mają średnio o 0,88 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy mają daleko do szkoły, ceteris paribus.
Podsumowując projekt, wykonano w nim wiele ważnych czynności z perspektywy analizy danych. W części Data Wrangling Wykonano oczyszczanie danych, walidacje danych i imputacje braków danych. W części wizualizacji wykonano wiele wykresów, które pozwoliły na zobrazowanie jak wygląda zestaw danych, korzystając z pakietów takich jak ggplot2 oraz plotly w celu tworzenia dobrze prezentujących się wizualizacji. W analizie opisowej obliczono statystyki opisowe oraz współczynniki korelacji dla wszystkich zmiennych. W części dotyczącej wnioskowania statystycznego wykonano wiele testów statystycznych, które pozwoliły na określenie struktury niektórych zmiennych oraz zbadanie występowania zależności pomiędzy zmiennymi a wynikami z egzaminów. Udało się w ten sposób ustalić, że zdecydowana większość zmiennych zawartych w zestawie danych jest powiązana z wynikami uczniów. W ostatnim rozdziale wykorzystano modelowanie ekonometryczne w celu określenia, w jaki sposób i z jaką siłą czynniki z zestawu danych wpływają na wyniki uczniów. W ten sposób stworzono model, który można również wykorzystać do przewidywania wyników uczniów. Można zatem powiedzieć, że udało się zbadać czynniki wpływające na wyniki uczniów, pod kątem jakie to są czynniki oraz w jaki sposób wpływają na wyniki.